查看原文
其他

快速上手Pandas数据结构合并

明慧 大数据应用 2022-10-18

今日份知识你摄入了么?

在本教程中,我们将通过示例来了解合并Pandas DataFrames的不同方法。







#

介绍

在许多现实生活场景中,为了便于管理,我们将数据存储在不同的文件中,经常需要将它们合并成一个更大的DataFrame进行分析。Pandas为我们提供了各种方法来合并DataFrame,如concat和merge。此外,它还提供了用于比较的实用程序。

我们将通过示例来了解这两种方法的工作原理。对于本教程,我们将假设你具备Python和Pandas的基本知识。

#

连接DataFrame


如果两个DataFrame格式相同,我们选择.concat()方法。它将一个DataFrame中的列或行附加到另一个DataFrame。.concat ()沿轴执行连接操作。在深入讨论其细节之前,我们快速了解一下语法及其参数。


pd.concat(objs,axis=0,join="outer",ignore_index=False,keys=None,levels=None,names=None,verify_integrity=False,copy=True,)


这里只关注主要参数:


  • objs :要连接的DataFrame对象或Series的列表。

  • axis :axis = 0 意味着pandas将第二个DataFrame堆叠在第一个DataFrame下方(按行连接),而axis =1意味着pandas将第二个DataFrame堆叠到第一个 DataFrame的右侧(按列连接)。默认情况下,axis = 0。

  • join:默认join=outer,outer用于union,inner用于intersection。

  • ignore_index:它会在连接过程中忽略索引,默认情况下,它为False。但如果索引没有意义,则忽略它们是有用的。

  • verify_integrity:它检查新连接轴中的重复项,但默认情况下,它为False。


示例:


import pandas as pd# First Dict with two 2 and 4 columnsdata_one = {'A' : ['A1','A2','A3','A4'] , 'B' : ['B1','B2','B3','B4']}# Second Dict with two 2 and 4 columnsdata_two = {'C' : ['C1','C2','C3','C4'] , 'D' : ['D1','D2','D3', 'D4']}# Converting to DataFramesdf_one=pd.DataFrame(data_one)df_two=pd.DataFrame(data_two)


#

场景 1:按列连接


假设A、B、C和D列代表不同的功能,但索引相同,则将C和D行连接到df_one 右侧更有意义。


# Joining the columnsnew_df = pd.concat([df_one,df_two],axis=1)

#

场景 2:按行连接


如果我们继续上述假设并按行将它们连接起来,那么生成的DataFrame将包含大量NaN值缺失数据。原因很简单,假设df_two中index = 0我们不能将它直接放在A列和B列下面,因为我们认为它们是值不存在的不同的函数。因此,pandas 将自动为A、B、C和D创建一个完整的行,它们各自的列中缺少值。


# Joining the rowsnew_df1 = pd.concat([df_one,df_two],axis=0)



请注意,我们的最终结果中有重复索引。因为默认情况下,ignore_index = False,它将DataFrame的索引保存为原始状态。这在我们的例子中可能没有用,所以我们将设置ignore_index = True。


# Joining the rowsnew_df2 = pd.concat([df_one,df_two],axis=0 , ignore_index= True)



如果两个DataFrame中的列表示相同的东西,只是命名不同,那么我们可以在连接之前重命名这些列。


# Joining the rowsdf_two.columns = df_one.columnsnew_df3 = pd.concat([df_one,df_two],axis=0 , ignore_index= True)


#

Merging Dataframes


Merge或Join Dataframes不同于Concat。Concat连接意味着只是沿着所需的轴将一个Dataframe堆叠在另一个Dataframe上。而Join的工作原理与SQL中的连接类似。我们可以根据唯一列组合Dataframe,这些方法性能明显更好。当一个 DataFrame是“查找表”时,它非常有用,其中包含我们想要连接到另一个的附加数据。我们来看看它的语法和参数:


pd.merge( left, right, how="inner", on=None, left_on=None, right_on=None,left_index=False, right_index=False, sort=True, suffixes=("_x", "_y"),copy=True, indicator=False, validate=None)


让我们看一下它的主要参数以及它们的用途:


  • left:Dataframe对象

  • right:Dataframe对象

  • how:连接类型,即inner、outer、left、right等。默认how = “inner”

  • on:DataFrame中共有的列,构成连接操作的基础。

  • left_on:如果使用right_index作为要加入的列,则必须指定将用作键的列。

  • right_on:left_on反之亦然

  • left_index:如果设置为True,则使用左DataFrame的行标签(索引)作为连接键

  • right_index:left_index 的反之亦然

  • sort:通过连接键按顺序对生成的DataFrame进行排序,但不建议这样做,因为它会严重影响性能。

  • suffixes:如果我们有一个重叠的列,你可以分配后缀来区分它们。默认情况下,它设置为 ('_x', '_y')。


示例:


sports和library DataFrame的例子,假设两个DataFrame中的“name”列是唯一的,可以用作主键。


import pandas as pd# First DataFramesports= pd.DataFrame({'sports_id':[1,2,3,4],'name':['Alex','David','James','Sara']})# Second DataFramelibrary= pd.DataFrame({'library_id':[1,2,3,4],'name':['David','James','Peter','Harry']})


#

场景一:Inner内连接和Outer外连接


对于它们两者,在. merge()方法中dataFrame的位置无关紧要,因为最终结果是相同的。如果我们将两个DataFrame视为两个集合,则内连接将引用它们的交集,而外连接将引用它们的并集。



inner_join = pd.merge(sports,library,how="inner",on="name") outer_join = pd.merge(library,sports,how="outer",on="name")

#

场景二:左右连接


在这里,我们放置DataFrame的顺序很重要。例如,在左连接中,放置在左侧位置的DataFrame对象的所有数据将与来自右侧DataFrame对象的匹配数据一起显示。右连接与左连接的作用正好相反。从一个例子中理解这个概念。


left_join = pd.merge(sports,library,how="left",on="name")right_join= pd.merge(library,sports,how="right",on="name")

#

场景三:使用索引连接


首先,使用set_index()方法修改sports表,使“name”列成为索引。


sports = sports.set_index("name")


如果现在我们将sports作为我们的左DataFrame,应用inner操作并设置left_index= True。


index_join = pd.merge(sports,library,how="inner",left_index = True, right_on="name")



请注意,它显示的结果与我们之前内连接的结果相同。


#

场景四:后缀属性


通过将sports_id和login_id更改为id对原始DataFrame进行修改。现在虽然名称相同,但我们指的是不同的id。Pandas可以识别它并添加后缀。稍后将看到如何自定义这些后缀。


# First DataFramesports= pd.DataFrame({'id':[1,2,3,4],'name':['Alex','David','James','Sara']})# Second DataFramelibrary= pd.DataFrame({'id':[1,2,3,4],'name':['David','James','Peter','Harry']})


inner_join = pd.merge(sports,library,how="inner",on="name")


这里id_x指的是左边的DataFrame,而id_y 指的是右边的DataFrame。虽然,它完成了它的工作,但为了代码更清晰,可读性更高,我们使用suffixes属性自定义这些后缀。


suffix_ = pd.merge(sports,library,how="inner",on="name", suffixes=('_sport','_lib'))


#

结论


本文旨在简化Pandas中合并行的概念。当你从.csv文件中提取大规模数据时,建议你开始执行连接操作之前分析一下数据的类型和格式。Pandas在这方面也有一些很好的方法。如有任何问题,请参阅Pandas的官方文档。最后强调,一切都需要实践,你可以自行尝试不同的DataFrame,以便更好地理解。


Kanwal Mehreen是一位有抱负的软件开发人员,她相信持续的努力和承诺。她是一位志向远大的程序员,对数据科学和机器学习领域有着浓厚的兴趣。

原文作者:Kanwal Mehreen

翻译作者:明慧

美工编辑:过儿

校对审稿:Miya

原文链接:https://www.kdnuggets.com/2022/09/combining-pandas-dataframes-made-simple.html


本周公开课预告

往期精彩回顾

10月22日,BA商业分析师求职训练营全面启动!

科学家V.S数据分析师面试全对比

数据分析求职最常用的30种大数据工具,你掌握几个了?

如何通过面试中的AB测试问题(以doordash为例)

处理不平衡数据的7个小技巧





点「在看」的人都变好看了哦

点击“阅读原文”查看数据应用学院核心课程

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存